iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
Python

pythonGUI學習筆記系列 第 22

Day 22 PySide6 子窗口

  • 分享至 

  • xImage
  •  

子窗口

子窗口是主窗口中的一個獨立視窗,可以用來顯示額外的資料,或者在子窗口增加功能,與主窗口互動。

窗口開啟和關閉

  • show() : 打開窗口。

  • close() : 關閉窗口。會完全被銷毀,不占用內存和資源。

  • hide() : 隱藏窗口。將窗口隱藏,不會被銷毀,但會占用內存和資源。

  • 範例 : 在主窗口調用子窗口時,必須使用 self 避免子窗口被回收。以下面範例是用按鈕控制子窗口開啟、關閉和隱藏。

  1. 先建立一個子窗口
class SubWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.lb = QLabel("這是子窗口")

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.lb)
        self.setLayout(self.layout)
  1. 在主窗口裡添加按鈕和標籤
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(300,300)
        #創建子窗口
        self.lb = QLabel("打開子窗口")

        self.SubWindow = SubWindow()
        self.Openbtn = QPushButton("開啟子窗口")
        self.Openbtn.clicked.connect(lambda: self.SubWindow.show())
        self.Closebtn = QPushButton("關閉子出口")
        self.Closebtn.clicked.connect(lambda: self.SubWindow.close())
        self.Hidebtn = QPushButton("隱藏子出口")
        self.Hidebtn.clicked.connect(lambda: self.SubWindow.hide())


        self.layout = QVBoxLayout()
        self.layout.addWidget(self.lb)
        self.layout.addWidget(self.Openbtn)
        self.layout.addWidget(self.Closebtn)
        self.layout.addWidget(self.Hidebtn)
        self.setLayout(self.layout)

窗口傳遞資料

  • 主窗口傳遞給子窗口 : 因為主窗口負責創建子窗口,窗口已經實例化並調用了子窗口,所以可以直接將主窗口的數據傳遞給子窗口。下面範例是,當按下按鈕時,主窗口中的 QLineEdit 的內容會被傳遞到子窗口的標籤上,實現數據的傳遞。
from PySide6.QtWidgets import QApplication , QWidget , QPushButton , QLabel , QVBoxLayout , QLineEdit

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        #開啟子窗口
        self.SubWindow = SubWindow(self)
        self.SubWindow.show()

        # 設定元件
        self.LineEdit = QLineEdit()
        self.btn = QPushButton("按我傳遞數據")
        self.btn.clicked.connect(lambda: self.SubWindow.lb2.setText(self.LineEdit.text()))

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.LineEdit)
        self.layout.addWidget(self.btn)
        self.setLayout(self.layout)

class SubWindow(QWidget):
    def __init__(self,parent):
        super().__init__()

        self.lb = QLabel("這是子窗口")
        self.lb2 = QLabel("空")

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.lb)
        self.layout.addWidget(self.lb2)
        self.setLayout(self.layout)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()
  • 子窗口傳遞給主窗口 : 因為子窗口內部無法直接訪問主窗口的屬性,因此我們需要在創建子窗口時,將主窗口的實例傳遞給子窗口,並使用它來更新主窗口的標籤。
from PySide6.QtWidgets import QApplication , QWidget , QPushButton , QLabel , QVBoxLayout , QLineEdit

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        #開啟子窗口
        self.SubWindow = SubWindow(self)
        self.SubWindow.show()

        # 設定元件
        self.lb = QLabel("空的")

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.lb)
        self.setLayout(self.layout)

class SubWindow(QWidget):
    def __init__(self,parent):
        super().__init__()

        self.lb = QLabel("這是子窗口")
        self.LineEdit = QLineEdit()
        self.btn = QPushButton("按我傳遞數據")
        self.btn.clicked.connect(lambda: parent.lb.setText(self.LineEdit.text()))

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.lb)
        self.layout.addWidget(self.LineEdit)
        self.layout.addWidget(self.btn)
        self.setLayout(self.layout)

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec()

總結

  • 窗口開啟和關閉
功能 方法
打開窗口 show()
關閉窗口 close()
隱藏窗口 hide()
  • 窗口傳遞資料
    • 主窗口傳遞給子窗口 : 已經在主窗口調用子窗口,所以可以直接將數據傳遞。
    • 子窗口傳遞給主窗口 : 因為子窗口內部沒有調用主窗口,所以創建窗口時將主窗口傳遞給子窗口。

上一篇
Day 21 PySide6 進度條(QProgress)
下一篇
Day 23: PySide6 播放影片
系列文
pythonGUI學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言